/**
 * 用户认证工具类
 * 提供登录信息存取、角色判断等功能
 */

// 存储键名
const TOKEN_KEY = 'token'
const USER_INFO_KEY = 'userInfo'
const USER_ROLE_KEY = 'userRole'

/**
 * 设置JWT令牌
 * @param {string} token - JWT令牌
 */
const setToken = function (token) {
  wx.setStorageSync(TOKEN_KEY, token)
}

/**
 * 获取令牌
 * @returns {string} JWT令牌
 */
const getToken = function () {
  return wx.getStorageSync(TOKEN_KEY) || ''
}

/**
 * 设置用户信息
 * @param {Object} userInfo - 用户信息对象
 */
const setUserInfo = function (userInfo) {
  wx.setStorageSync(USER_INFO_KEY, userInfo)
}

/**
 * 获取用户信息
 * @returns {Object} 用户信息对象
 */
const getUserInfo = function () {
  return wx.getStorageSync(USER_INFO_KEY) || {}
}

/**
 * 设置用户角色
 * @param {string} role - 用户角色，如: 'user', 'provider'
 */
const setUserRole = function (role) {
  wx.setStorageSync(USER_ROLE_KEY, role)
}

/**
 * 获取用户角色
 * @returns {string} 用户角色
 */
const getUserRole = function () {
  return wx.getStorageSync(USER_ROLE_KEY) || 'user'
}

/**
 * 判断是否已登录
 * @returns {boolean} 是否已登录
 */
const isLoggedIn = function () {
  return !!getToken()
}

/**
 * 判断是否为服务人员
 * @returns {boolean} 是否为服务人员
 */
const isProvider = function () {
  return getUserRole() === 'provider'
}

/**
 * 判断是否为普通用户
 * @returns {boolean} 是否为普通用户
 */
const isUser = function () {
  return getUserRole() === 'user'
}

/**
 * 判断是否为管理员
 * @returns {boolean} 是否为管理员
 */
const isAdmin = function () {
  return getUserRole() === 'admin'
}

/**
 * 判断用户是否被禁用
 * @returns {boolean} 是否被禁用
 */
const isUserBanned = function () {
  const userInfo = getUserInfo()
  return userInfo.status === 0
}

/**
 * 清除登录信息
 */
const clearLoginInfo = function () {
  wx.removeStorageSync(TOKEN_KEY)
  wx.removeStorageSync(USER_INFO_KEY)
  wx.removeStorageSync(USER_ROLE_KEY)
}

/**
 * 检查页面访问权限
 * @param {Object} pageObj - 页面对象
 * @param {Array<string>} allowRoles - 允许访问的角色数组
 * @param {string} redirectUrl - 权限不足时的重定向地址
 * @returns {boolean} 是否有权限访问
 */
const checkPagePermission = function (pageObj, allowRoles, redirectUrl = '/pages/login/login') {
  const role = getUserRole()

  // 未登录或角色不在允许列表中
  if (!isLoggedIn() || (allowRoles && allowRoles.length && !allowRoles.includes(role))) {
    wx.showToast({
      title: '您没有权限访问此页面',
      icon: 'none'
    })

    setTimeout(() => {
      wx.navigateTo({
        url: redirectUrl
      })
    }, 1500)

    return false
  }

  return true
}

/**
 * 页面权限拦截器
 * 用于在页面onLoad时检查权限
 * @param {Object} pageObj - 页面对象
 * @param {Array<string>} allowRoles - 允许访问的角色列表
 * @param {string} redirectUrl - 权限不足时的重定向URL
 */
const pagePermission = function (pageObj, allowRoles, redirectUrl = '/pages/login/login') {
  const originalOnLoad = pageObj.onLoad

  // 重写onLoad，加入权限检查
  pageObj.onLoad = function (options) {
    // 检查权限
    if (!checkPagePermission(this, allowRoles, redirectUrl)) {
      return
    }

    // 调用原来的onLoad
    if (originalOnLoad) {
      originalOnLoad.call(this, options)
    }
  }

  return pageObj
}

module.exports = {
  setToken,
  getToken,
  setUserInfo,
  getUserInfo,
  setUserRole,
  getUserRole,
  isLoggedIn,
  isProvider,
  isUser,
  isAdmin,
  isUserBanned,
  clearLoginInfo,
  checkPagePermission,
  pagePermission
} 